package com.shujia.hdfs;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileStatus;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;

import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;

public class Code08DeleteAll {
    public static void main(String[] args) throws URISyntaxException, IOException, InterruptedException {
        Configuration conf = new Configuration();
        FileSystem fileSystem = FileSystem.get(new URI("hdfs://master:9000"), conf, "root");
        FileStatus fileStatus = fileSystem.getFileStatus(new Path("/test"));
        localDelete(fileSystem,fileStatus.getPath() , fileStatus.getPath());
        fileSystem.close();
    }

    /**
     * 方法需要实现：
     * 1.如果是文件直接删除
     * 2.如果是目录
     * 2.1 查看目录下的内容，如果存有文件或目录 那么进入下一级继续查看
     * 2.2 如果目录下没有内容，空目录直接删除
     */
    // start_path 参数用来做开始路径的标记 不用来做删除
    public static void localDelete(FileSystem fileSystem, Path start_path, Path next_path) {
        try {
            if (fileSystem.isFile(next_path)) {
                fileSystem.delete(next_path, false);
            } else {
                // 获取指定路径下的所有文件或目录
                FileStatus[] fileStatuses = fileSystem.listStatus(next_path);
                if (fileStatuses.length > 0) {
                    for (FileStatus fileStatus : fileStatuses) {
                        Path dir_path = fileStatus.getPath();
                        // 如果存在子路径 那么直接调用当前的方法
                        localDelete(fileSystem, start_path, dir_path);
                    }
                } else {
                    // 如果为空目录 直接删除
                    fileSystem.delete(next_path, false);
                    if (start_path.equals(next_path)) {
                        System.out.println("已删除到最开始路径..退出迭代");
                    } else {
                        // 如果不是最开始的路径，那么需要继续网上进行获取父路径
                        localDelete(fileSystem, start_path, next_path.getParent());
                    }
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }

    }


}
